home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / lib / perl / sperl.pl < prev    next >
Text File  |  1990-12-13  |  4KB  |  168 lines

  1. #
  2. # sperl.pl
  3. #
  4. # Perl library for sosp tracing.  Use with "sperl".  Sperl has the following
  5. # built-in routines:
  6. #
  7. # Routines for manipulating trace files:
  8. #
  9. # $FD = &TraceOpenFile($filename)
  10. #    
  11. #    $filename is the name of the file to open.  $FD is a handle used
  12. #    internally by sperl and is passed as an argument to other 
  13. #    routines.  Don't screw up and pass something else, otherwise
  14. #    sperl will likely dump core.  It's ok to open lots of trace files,
  15. #    though.  $FD is set to undefined if the file isn't opened.
  16. #
  17. # $hdr = &TraceReadHeader($FD)
  18. #
  19. #    Reads a header from the file.  The header is returned as a string,
  20. #    but it is byte-swapped into the correct order for your machine.
  21. #    $hdr is set to undefined if there is an error.
  22. #
  23. #
  24. # @fields = &TraceParseHeader($hdr)
  25. #
  26. #    Takes a header from TraceReadHeader and splits it up into an array.
  27. #    You could also use "unpack" to do this, but this routine is faster.
  28. #    $fields[0] is set to undefined if there is an error.
  29. #
  30. # $record = &TraceReadRecord($FD, [$event])
  31. #
  32. #    Just like TraceReadHeader but reads a record instead. If you add
  33. #    a second argument "event", it will be set to the event of the
  34. #    so you can avoid parsing records for events you don't care about.
  35. #
  36. # @fields = &TraceParseRecord($record)
  37. #
  38. #    Same as TraceParseHeader but parses a record instead.
  39. #
  40. # &TraceCloseFile($FD)
  41. #
  42. #    Closes a trace file.
  43. #
  44. # Misc routines:
  45. #
  46. # ($seconds, $microseconds) = &TraceGetTime($bootSecs, $bootUsecs, 
  47. #                    $diffSecs, $diffUsecs)
  48. #
  49. #     Takes the boot time and adds it to the time in the record to get the
  50. #     absolute time that the event occurred.
  51. #
  52. # $string = &TraceTimeString($seconds, $microseconds)
  53. #
  54. #    Takes a time of the form found in the trace files and produces
  55. #    a string you can print.
  56.  
  57. #
  58. # Name of events.
  59. #
  60. $TypeNames[1] = "OPEN";
  61. $TypeNames[2] = "DELETE";
  62. $TypeNames[3] = "CREATE";
  63. $TypeNames[4] = "MKLINK";
  64. $TypeNames[5] = "SET_ATTR";
  65. $TypeNames[6] = "GET_ATTR";
  66. $TypeNames[7] = "LSEEK";
  67. $TypeNames[8] = "CLOSE";
  68. $TypeNames[9] = "MIGRATE";
  69. $TypeNames[10] = "TRUNCATE";
  70. $TypeNames[11] = "CONSIST_CHANGE";
  71. $TypeNames[12] = "READ";
  72. $TypeNames[13] = "LOOKUP";
  73. $TypeNames[14] = "CONSIST_ACTION";
  74. $TypeNames[15] = "PREFIX";
  75. $TypeNames[16] = "LOOKUP_OP";
  76. $TypeNames[17] = "DELETE_DESC";
  77.  
  78. #
  79. # @fields = &TraceGetHeader($FD)
  80. #
  81. #    Reads and parses a header all in one shot.
  82. #
  83. sub TraceGetHeader {
  84.     if ($#_ != 0) {
  85.     printf("Usage: &TraceGetHeader($FD)\n");
  86.     return ();
  87.     } else {
  88.     local($hdr) = &TraceReadHeader($_[0]);
  89.     if (!defined($hdr)) {
  90.         return ();
  91.     }
  92.     &TraceParseHeader($hdr);
  93.     }
  94. }
  95.  
  96. #
  97. # @fields = &TraceGetRecord($FD)
  98. #
  99. #    Reads and parses a record all in one shot.
  100. #
  101. sub TraceGetRecord {
  102.     if ($#_ != 0) {
  103.     printf("Usage: &TraceGetRecord($FD)\n");
  104.     return ();
  105.     } else {
  106.     local($record) = &TraceReadRecord($_[0]);
  107.     if (!defined($record)) {
  108.         return ();
  109.     }
  110.     &TraceParseRecord($record);
  111.     }
  112. }
  113.  
  114. #
  115. # @time = &TraceSubtractTime(@previous, @current)
  116. #
  117. #   Each array contains two element: 0 is the seconds, 1 is the microseconds.
  118. #   Returns the current time minus the previous time.
  119. #
  120. sub TraceSubtraceTime {
  121.     local(@result);
  122.     $result[0] = $_[2] - $_[0];
  123.     $result[1] = $_[3] - $_[1];
  124.     if ($result[1] < 0) {
  125.     $result[0]--;
  126.     $result[1] += 1000000;
  127.     }
  128.     @result;
  129. }
  130.  
  131. #
  132. # $string = &TraceTimeString2(@time)
  133. #
  134. #    The original TraceTimeString should be called "TraceDateString"
  135. #    since it interprets the time as universal time.  This routine
  136. #    prints out the time in terms of days, hours, minutes, seconds
  137. #     and microseconds.
  138. #
  139. sub TraceTimeString2 {
  140.     local($string);
  141.     local($seconds) = $_[0];
  142.     local($days) = 0;
  143.     local($hours) = 0;
  144.     local($minutes) = 0;
  145.     printf("seconds = %d\n", $seconds);
  146.     if ($seconds > 86400) {
  147.     $days = $seconds / 86400;
  148.     printf("%d\n", $days * 86400);
  149.     $seconds -= int($days) * 86400;
  150.     }
  151.     printf("seconds = %d\n", $seconds);
  152.     if ($seconds > 3600) {
  153.     $hours = $seconds / 3600;
  154.     $seconds -= int($hours) * 3600;
  155.     }
  156.     printf("seconds = %d\n", $seconds);
  157.     if ($seconds > 60) { 
  158.     $minutes = $seconds / 60;
  159.     $seconds -= int($minutes) * 60;
  160.     }
  161.     printf("seconds = %d\n", $seconds);
  162.     $string = sprintf("%2d+%02d:%02d:%02d.%3.3d\n", $days, $hours,
  163.             $minutes, $seconds, $_[1] / 1000);
  164.     return $string;
  165. }
  166.  
  167.  
  168.